package br.com.eSink.connection;

import br.com.esink.tests.Logging;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 *
 * @author Administrador
 */
public class Sharing {

    /*
     * CAMINHO[0] = MUSICA
     * CAMINHO[1] = VIDEO
     * CAMINHO[2] = IMAGENS
     */
    private static String[] path = {"/sdcard/media/music", "/sdcard/media/video", "/sdcard/media/image"};

    public static void sendFile(Socket skt, File file) {

        //COLOCA DADOS DO ARQUIVO EM UM BYTE[]
        byte[] mybytearray = new byte[(int) file.length()];
        FileInputStream fis;
        Logging.write("Enviando arquivo pelo método\n", true);

        try {
            //ATRIBUI AO STREAM DE ENTRADA DE ARQUIVO O ARQUIVO
            fis = new FileInputStream(file);
            //CRIA UM STREAM DE ENTRADA EM BUFFER
            BufferedInputStream bis = new BufferedInputStream(fis);
            //CRIA UM STREAM DE ENTRADA DE DADOS
            DataInputStream dis = new DataInputStream(bis);
            //LE O ARRAY QUE CORRESPONDE AO ARQUIVO
            dis.readFully(mybytearray, 0, mybytearray.length);
            //RECEBE O STREAM DE SA�DA DO SOCKET
            OutputStream os = skt.getOutputStream();
            //CRIA UM STREAM DE SA�DA DE DADOS
            DataOutputStream dos = new DataOutputStream(os);
            //ENVIA O NOME DO ARQUIVO
            dos.writeUTF(file.getName());
            //ENVIA O TAMANHO DO ARQUIVO
            dos.writeLong(mybytearray.length);
            //ENVIA O BYTE[] DO ARQUIVO
            dos.write(mybytearray, 0, mybytearray.length);

            //DESCARREGA O STREAM
            dos.flush();

        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    //RECEBE ARQUIVO VIA SOCKET E ARMAZENA ARQUIVO NA PASTA SELECIONADA
    public static File requestFile(Socket skt, String caminho) {

        int bytesRead;
        InputStream in;

        try {
            //RECEBE INPUTSREAM DO SOCKET
            in = skt.getInputStream();
            //RECEBE INPUTSTREAM DE DADOS
            DataInputStream clientData = new DataInputStream(in);
            //RECEBE NOME DO ARQUIVO
            String fileName = clientData.readUTF();
            //CRIA ARQUIVO COM O CAMINHO PEDIDO E SEGUIDO DE NOME
            File file = new File(caminho + "/" + fileName);
            //CRIA UM OUTPUTSTREAM COM ESTE ARQUIVO
            OutputStream output = new FileOutputStream(file);
            //RECEBE TAMANHO DO ARQUIVO
            long size = clientData.readLong();
            //CRIA BUFFER PARA ARMAZENAR BYTES QUE S�O RECEBIDOS EM BLOCOS DE 1 MB
            byte[] buffer = new byte[1024];
            //RECEBE OS BLOCOS DO ARQUIVO E GRAVA DE 1 MB EM 1 MB
            while (size > 0 && (bytesRead = clientData.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) {
                output.write(buffer, 0, bytesRead);
                size -= bytesRead;
            }
            //DESCARREGA INFORMA��O
            output.flush();
            //RETORNA ARQUIVO COMPLETO
            return file;
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        return null;
    }

    //RECEBE ARQUIVO VIA SOCKET E ARMAZENA ARQUIVO EM PASTA PADR�O
    public static File requestFile(Socket skt) {

        int bytesRead;
        InputStream in;

        try {
            //RECEBE INPUTSREAM DO SOCKET
            in = skt.getInputStream();
            //RECEBE INPUTSTREAM DE DADOS
            DataInputStream clientData = new DataInputStream(in);
            //RECEBE NOME DO ARQUIVO
            String fileName = clientData.readUTF();
            //CRIA ARQUIVO COM O CAMINHO PADRAO E SEGUIDO DE NOME
            File file = null;
            System.out.println("Método Enviar");
            if (fileName.endsWith("mp3")
                    || fileName.endsWith("wma")
                    || fileName.endsWith("m4a")
                    || fileName.endsWith("MP3")
                    || fileName.endsWith("WMA")
                    || fileName.endsWith("M4A")) {
                file = new File(path[0] + "/" + fileName);
            } else {
                if (fileName.endsWith("mp4")
                        || fileName.endsWith("wmv")
                        || fileName.endsWith("avi")
                        || fileName.endsWith("MP4")
                        || fileName.endsWith("WMV")
                        || fileName.endsWith("AVI")) {
                    file = new File(path[1] + "/" + fileName);
                } else {
                    if (fileName.endsWith("jpg")
                            || fileName.endsWith("png")
                            || fileName.endsWith("gif")
                            || fileName.endsWith("JPG")
                            || fileName.endsWith("PNG")
                            || fileName.endsWith("GIF")) {
                        file = new File(path[2] + "/" + fileName);
                    }
                }
            }
            //CRIA UM OUTPUTSTREAM COM ESTE ARQUIVO
            OutputStream output = new FileOutputStream(file);
            //RECEBE TAMANHO DO ARQUIVO
            long size = clientData.readLong();
            //CRIA BUFFER PARA ARMAZENAR BYTES QUE S�O RECEBIDOS EM BLOCOS DE 1 MB
            byte[] buffer = new byte[1024];
            //RECEBE OS BLOCOS DO ARQUIVO E GRAVA DE 1 MB EM 1 MB
            while (size > 0 && (bytesRead = clientData.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) {
                output.write(buffer, 0, bytesRead);
                size -= bytesRead;
            }
            //DESCARREGA INFORMA��O
            output.flush();
            System.out.println("oi");

            //RETORNA ARQUIVO COMPLETO
            return file;
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        return null;
    }

    public static int requestQuantity(Socket skt, int num) {


        int bytesRead;
        InputStream in;
        int qtt = 0;
        try {
            // RECEBE INPUTSREAM DO SOCKET
            in = skt.getInputStream();
            // RECEBE INPUTSTREAM DE DADOS
            DataInputStream clientData = new DataInputStream(in);
            // RECEBE NOME DO ARQUIVO
            qtt = clientData.readInt();

            return qtt;
        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        return qtt;

    }

    public static void sendQuantity(Socket skt, int num) {

        //COLOCA DADOS DO ARQUIVO EM UM BYTE[]

        Logging.write("Enviando quantidade de arquivos pelo método\n", true);
        try {

            OutputStream os = skt.getOutputStream();
            //CRIA UM STREAM DE SA�DA DE DADOS
            DataOutputStream dos = new DataOutputStream(os);
            //ENVIA A QUANTIDADE DE ARQUIVOS
            dos.writeInt(num);
            //DESCARREGA O STREAM
            dos.flush();
        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }
}
